<?php
/**
 * Contrôleur de la fonctionnalité "réservation"
 *
 * @package application
 * @subpackage controllers
 */
class ReservationController extends Zend_Controller_Action
{
    /**
     * Table des reservations
     *
     * @var TReservation
     */
    private $_reservationTable;

    /**
     * Initialisation du contrôleur : titre et sous-menu
     * Appelé avant chaque action
     */
    public function init()
    {
        // Titre par défaut des pages du contrôleur
        $this->view->setTitrePage("Réservation des salles");
        
        // Récupération des variables utiles
        $controller    = $this->getRequest()->getParam('controller');
        $defaultAction = $this->getFrontController()->getDefaultAction();

        // création du sous menu
        $this->view->submenu = array(
        $this->view->link($controller, $defaultAction) => $this->view->translate('accueil'),
        $this->view->url(array(), 'reservations')      => $this->view->translate('lister'),
        $this->view->link($controller, 'edit')         => $this->view->translate('ajouter'),
        $this->view->link($controller, 'export')       => $this->view->translate('exporter')
        );

        // rendu du sous menu dans le segment 'submenu' de la réponse
        // Le Layout va réagir à ceci.
        $this->renderScript('common/submenu.phtml', 'submenu');

        // récupération du modèle TReservation utile dans toutes les actions
        $this->_reservationTable = new TReservation();

        // par défaut un appel à render() annule le rendu automatique
        // restauration du rendu via le helper viewRenderer.
        // (cette action rend une vue)
        $this->_helper->viewRenderer->setNoRender(false);

        // Initialisation du contextSwitch pour le listage csv, pdf, xml ou json
        // Essayer : http://<url_appli>/reservation/list/format/xml/page/2
        $this->_helper->contextSwitch()
        ->addContext('csv',  Zfbook_Controller_ContextSwitch_Csv::getContext())
        ->setCallBack('xml', 'init', array('Zfbook_Controller_ContextSwitch_XmlJson','initContext'))
        ->addActionContext('list', array('csv', 'xml', 'json'))
        ->initContext();
    }

    /**
     * Page d'accueil des réservations
     * 
     * Affiche une page statique
     */
    public function indexAction()
    {
    }

    /**
     * Affiche la liste des réservations
     */
    public function listAction()
    {
        $this->view->setTitrePage("Liste des réservations");

        // Tentative de recherche des réservations depuis le cache
        $reservations = Zfbook_Cache::get('reservations');
        $this->view->cached = (boolean) $reservations;

        // Les réservations ne sont pas dans le cache, il faut aller
        // les chercher dans la base de données
        if (!$reservations) {
            $reservationListTable = new TReservationList();
            $reservations = $reservationListTable->fetchAll()->toArray();

            // Insertion des réservations dans le cache
            Zfbook_Cache::set($reservations, 'reservations');
        }

        // Gestion de la pagination
        $paginator = Zend_Paginator::factory($reservations);
        $paginator->setItemCountPerPage(2);
        $paginator->setCurrentPageNumber($this->getRequest()->getParam('page'));
        $this->view->reservations = $paginator;

        if ($this->_helper->contextSwitch->getCurrentContext() == 'json') {
            $this->_helper->json->sendJson($reservations);
        }
    }

    /**
     * Edite et enregistre une réservation
     */
    public function editAction()
    {
        // Récupération des paramètres et de la réservation à éditer si nécessaire.
        $params = $this->getRequest()->getParams();
        $isUpdate = isset($params['r']);
        if ($isUpdate) {
            $params['r'] = (int)$params['r'];

            // Vérification des droits pour cette reservation
            $this->_helper->aclCheck($params['r'], 'editer');
            $this->view->setTitrePage("Editer une réservation existante");
            $reservation = $this->_reservationTable->find((int)$params['r'])->current();
        } else {
            $this->_helper->aclCheck('reservations', 'ajouter');
            $this->view->setTitrePage("Ajouter une réservation");

            // Création d'une réservation vide s'il s'agit d'un ajout
            $reservation = $this->_reservationTable->createRow();
        }

        // Création du formulaire et déclaration des paramètres généraux
        $form = new Zfbook_Form_Reservation();
        $form->setAction($this->view->link('reservation' , 'edit', null, '', 'default', !$isUpdate))
             ->setMethod('post')
             ->setDefaults($reservation->toArray());

        // Création du formulaire et ajout/suppression
        if ($this->getRequest()->isPost() && $form->isValid($_POST)) {

            // Retrait des informations depuis les données en POST
            // et ajout dans le modèle.
            $values = $form->getValues();
            $values['creator']  = Zend_Auth::getInstance()->getIdentity()->id;
            $reservation->setFromArray(array_intersect_key($values, $reservation->toArray()));

            // Sauvegarde des informations
            $reservation->save();

            // Sauvegarde des ACLs concernant cette salle
            if (!$isUpdate) {
                $this->_helper->aclCheck->acl->add(new Zend_Acl_Resource($reservation->id));
            }
            $this->_helper->aclCheck->acl->allow('user', $reservation->id);

            // Cette action modifie la liste des résultats :
            // suppression du cache pour mise à jour
            Zfbook_Cache::clean('reservations');

            // Redirection vers la liste des réservations
            $this->_redirect($this->_helper->url('index', 'reservation'));
        }

        // Assignation du formulaire pour affichage
        $this->view->form = $form;
    }

    /**
     * Supprime un enregistrement
     */
    public function deleteAction()
    {
        // Récupération de l'identifiant de la
        // réservation à supprimer
        $params = $this->getRequest()->getParams();
        $idReservation = (int)$params['r'];

        // Vérification des droits pour cette reservation
        $this->_helper->aclCheck($idReservation, "supprimer");

        // Tente de supprimer
        try {
            $this->_reservationTable->delete("id=$idReservation");

            // Suppression dans les acls de la reservation
            $this->_helper->aclCheck->acl->remove($idReservation);

            // Suppression du cache pour mise à jour
            Zfbook_Cache::clean('reservations');
        } catch(Zend_Exception $e) {
            throw new Zfbook_UserException('reservation inexistante');
        }

        // Redirection sur la page précédente
        $this->_helper->redirectorToOrigin();
    }

    /**
     * Export (pdf / csv / mail) de la liste des réservations
     * 
     * Exemple d'export sans passer par contextswitch
     */
    public function exportAction()
    {
        if ($this->_hasParam('format')) {
            $exportType = $this->getRequest()->getParam('format');
            $this->_helper->viewRenderer->setNoRender(true);
            $this->_helper->layout->disableLayout();
            $this->_helper->exportReservations($exportType);
        } else {
            $this->view->setTitrePage("Export de la liste des réservations");
        }
    }
}
